package ch06
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;

	import org.osmf.display.ScaleMode;

	import utils.Ball;

	/**
	 * 反弹.
	 * 当检测到物体超出舞台后，开始应用弹性，不改变改变物体的位置，只改变它的速度向量。
	 * 方法很简单：如果物体超出了左、右边界，只需要使它的 x 速度向量取反。
	 * 如果超出了上、下边界，只需要让 y 速度向量取反。
	 *
	 * 反弹的步骤如下：
	 *  ■ 判断物体是否超出了边界；
	 *  ■ 如果是，将其置到边界处；
	 *  ■ 然后将它的速度向量取反。
	 * @author sjp
	 *
	 */
	public class Bouncing extends Sprite
	{
		private var ball:Ball;
		private var vx:Number=0;
		private var vy:Number=0;

		public function Bouncing()
		{
			super();
			init();
		}

		private function init():void
		{
			stage.align=StageAlign.TOP_LEFT;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			ball=new Ball(100);
			ball.vx=Math.random() * 5 - 10;
			ball.vy=Math.random() * 5 - 10;
			ball.x=stage.stageWidth / 2;
			ball.y=stage.stageHeight / 2;
			this.addChild(ball);
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}

		private function enterFrameHandler(event:Event):void
		{
			ball.x+=ball.vx;
			ball.y+=ball.vy;
			var left:Number=0;
			var right:Number=stage.stageWidth;
			var top:Number=0;
			var bottom:Number=stage.stageHeight;
			/**
			 * 对于反弹的时机来说，我们不并希望等到物体完全超出了舞台后开始反弹。同样，也不希望出现半张图片的效果。
			 * 比如，往墙上扔一个球，不希望球的一半进入墙体后再反弹回来。
			 * 因此，首先要判断出小球首次超出边界的瞬间。然后，将小球的运动路径取反，再加上小球宽度/高度的一半。
			 * 比如： if(ball.x – ball.radius > right) . . .
			 * 就要变为 if(ball.x + ball.radius > right) . . .
			 * */
			/**
			 * 只要物体超出了舞台，即使只有一少部分，都要使它的速度向量取反，并且还需要将物体重新定位到边界处，这就形成了一个非常明显的撞击反弹的效果。
			 * 如果不调整物体的位置，到下一帧，在物体移动之前，也许仍然处在边界外。如果这样的话，物体的速度向量又将取反，则向墙内运动！
			 * 就会产生物体进出墙体的情形，然后在这附近振荡。
			 * x 轴的全部 if 语句如下： if(ball.x + ball.radius > right) { ball.x = right – ball.radius; vx *= -1; }
			 * else if(ball.x – ball.radius < left) { ball.x = left + ball.radius; vx *= -1; }
			 * */
			if (ball.x - ball.radius < left)
			{
				ball.x=left + ball.radius;
				ball.vx*=-1;
			}
			if (ball.x + ball.radius > right)
			{
				ball.x=right - ball.radius;
				ball.vx*=-1;
			}
			if (ball.y - ball.radius < top)
			{
				ball.y=top + ball.radius;
				ball.vy*=-1;
			}
			if (ball.y + ball.radius > bottom)
			{
				ball.y=bottom - ball.radius;
				ball.vy*=-1;
			}
		}
	}
}